import torch
from d2l import torch as d2l

# 1、ReLu函数，仅保留正元素并丢弃所有负元素
x = torch.arange(-8.0, 8.0, 0.1, requires_grad=True)
y = torch.relu(x)
d2l.plot(x.detach(), y.detach(), 'x', 'relu(x)', figsize=(5, 2.5))
# 绘制relu函数的导数图像
y.backward(torch.ones_like(x), retain_graph=True)
d2l.plot(x.detach(), x.grad, 'x', 'grad of relu', figsize=(5, 2.5))

# 2、sigmoid函数，：它将范围（-inf, inf）中的任意输入压缩到区间（0, 1）中的某个值，1/(1+exp(-x))
y = torch.sigmoid(x)
d2l.plot(x.detach(), y.detach(), 'x', 'sigmoid(x)', figsize=(5, 2.5))
#绘制sigmoid函数的导数图像，记得清除以前的梯度
x.grad.zero_()
y.backward(torch.ones_like(x), retain_graph=True)
d2l.plot(x.detach(), x.grad, 'x', 'grad of sigmoid', figsize=(5, 2.5))

# 3、tanh函数，将其输入压缩转换到区间(-1, 1)上，[1-exp(-2x)]/[1+exp(-2x)]
y = torch.tanh(x)
d2l.plot(x.detach(), y.detach(), 'x', 'tanh(x)', figsize=(5, 2.5))
# 绘制tanh的导数图像，记得清除梯度
x.grad.zero_()
y.backward(torch.ones_like(x), retain_graph=True)
d2l.plot(x.detach(), x.grad, 'x', 'grad of tanh', figsize=(5, 2.5))
